<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<style>
body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url() no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url() repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }
li {
  margin: 0; }
ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0;border-collapse: collapse; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

sup {
    font-size: 0.83em;
    vertical-align: super;
    line-height: 0;
}
* {
	-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
    body {
        width: 854px;
        margin:0 auto;
    }
}
@media print {
	table, pre {
		page-break-inside: avoid;
	}
	pre {
		word-wrap: break-word;
	}
}
</style>
<title>Artisan 开发</title>

</head>
<body>
<h1>Artisan 开发</h1>

<ul>
<li><a href="#introduction">简介</a></li>
<li><a href="#building-a-command">构建命令</a></li>
<li><a href="#registering-commands">注册命令</a></li>
<li><a href="#calling-other-commands">调用其他命令</a></li>
</ul>


<p><a name="introduction"></a></p>

<h2>简介</h2>

<p>除了 Artisan 提供的命令，您也可以为应用程序构建自己的命令。您可以保存定制的命令在 <code>app/commands</code> 目录下，同时您也可以选择自定义的存储目录只要您的命令能在 <code>composer.json</code> 的设置中被自动加载。</p>

<p><a name="building-a-command"></a></p>

<h2>构建命令</h2>

<h3>产生类</h3>

<p>为了创建一个命令，您可以使用 <code>command:make</code> Artisan 命令，将生成一条命令的框架便于您起步：</p>

<p><strong>创建一个命令类</strong></p>

<pre><code>php artisan command:make FooCommand
</code></pre>

<p>默认情况下，产生的类被存放在 <code>app/commands</code> 目录下，同时您也可以指定自定义的目录和名字空间：</p>

<pre><code>php artisan command:make FooCommand --path="app/classes" --namespace="Classes"
</code></pre>

<h3>填写命令</h3>

<p>一旦命令被生成，应该填写这个类的 <code>name</code> 和 <code>description</code> 属性，将用于在 <code>list</code> 页面显示这条命令。</p>

<p>当命令运行的时候 <code>fire</code> 函数将被调用。您可以在这个函数里放置任何命令逻辑。</p>

<h3>参数 &amp; 选项</h3>

<p>可以通过 <code>getArguments</code> 和 <code>getOptions</code> 函数为命令定义任何接受的参数和选项。这两个函数都将返回一个数组。</p>

<p>当定义 <code>arguments</code>，数组定义值表示如下：</p>

<pre><code>array($name, $mode, $description, $defaultValue)
</code></pre>

<p>参数 <code>mode</code> 的值可以是 <code>InputArgument::REQUIRED</code>, <code>InputArgument::OPTIONAL</code> 中的任意一个。</p>

<p>当定义 <code>options</code>，数组定义值表示如下：</p>

<pre><code>array($name, $shortcut, $mode, $description, $defaultValue)
</code></pre>

<p>对于选项，参数 <code>mode</code> 的值可以是<code>InputOption::VALUE_REQUIRED</code>, <code>InputOption::VALUE_OPTIONAL</code>, <code>InputOption::VALUE_IS_ARRAY</code>, <code>InputOption::VALUE_NONE</code> 中的一个。</p>

<p><code>VALUE_IS_ARRAY</code> 模式表明，该开关可用于多次调用该命令时：</p>

<pre><code>php artisan foo --option=bar --option=baz
</code></pre>

<p><code>VALUE_NONE</code> 选项表明该选项值只能用来作为一个开关：</p>

<pre><code>php artisan foo --option
</code></pre>

<h3>获取输入</h3>

<p>当命令执行的时候，您显然需要获取该命令所接收的参数和选项。要做到这一点，您可以使用 <code>argument</code> 和 <code>option</code> 函数：</p>

<p><strong>获取命令的一个参数的值</strong></p>

<pre><code>$value = $this-&gt;argument('name');
</code></pre>

<p><strong>获取命令的所有参数的值</strong></p>

<pre><code>$arguments = $this-&gt;argument();
</code></pre>

<p><strong>获取命令的一个选项</strong>*</p>

<pre><code>$value = $this-&gt;option('name');
</code></pre>

<p><strong>获取命令的所有选项</strong></p>

<pre><code>$options = $this-&gt;option();
</code></pre>

<h3>输出</h3>

<p>将输出发送到控制台，您可以使用<code>info</code>, <code>comment</code>, <code>question</code> 和 <code>error</code>函数。这些函数中的每一个将根据它们的目的使用合适的 ANSI 颜色。</p>

<p><strong>发送信息到终端</strong></p>

<pre><code>$this-&gt;info('Display this on the screen');
</code></pre>

<p><strong>发送错误消息到终端</strong></p>

<pre><code>$this-&gt;error('Something went wrong!');
</code></pre>

<h3>询问输入</h3>

<p>您可以使用 <code>ask</code> 和 <code>confirm</code> 函数提示用户输入：</p>

<p><strong>询问用户输入</strong></p>

<pre><code>$name = $this-&gt;ask('What is your name?');
</code></pre>

<p><strong>询问用户输入密码</strong></p>

<pre><code>$password = $this-&gt;secret('What is the password?');
</code></pre>

<p><strong>询问用户确认</strong></p>

<pre><code>if ($this-&gt;confirm('Do you wish to continue? [yes|no]'))
{
    //
}
</code></pre>

<p>您也可以为 <code>confirm</code> 指定一个默认值，应该是 <code>true</code> 或者 <code>false</code>：</p>

<pre><code>$this-&gt;confirm($question, true);
</code></pre>

<p><a name="registering-commands"></a></p>

<h2>注册命令</h2>

<p>一旦您的命令完成后，您需要使用 Artisan 进行注册，这样才能够被使用。这通常在 <code>app/start/artisan.php</code> 文件中完成。在这个文件中，您可以使用 <code>Artisan::add</code> 函数注册命令：</p>

<p><strong>注册一个 Artisan 命令</strong></p>

<pre><code>Artisan::add(new CustomCommand);
</code></pre>

<p>如果您的命令在应用程序的 <a href="/docs/ioc">IoC 容器</a> 中注册，您可以使用 <code>Artisan::resolve</code> 函数使它对 Artisan 可用：</p>

<p><strong>注册一个在 IoC 容器中的命令</strong></p>

<pre><code>Artisan::resolve('binding.name');
</code></pre>

<p><a name="calling-other-commands"></a></p>

<h2>调用其他命令</h2>

<p>有时您可能希望在您的命令中调用其他命令，您可以通过使用 <code>call</code> 函数实现：</p>

<p><strong>调用其他命令</strong></p>

<pre><code>$this-&gt;call('command.name', array('argument' =&gt; 'foo', '--option' =&gt; 'bar'));
</code></pre>
</body>
</html>